import Vue from 'vue';
import Vuex from 'vuex';
import chatAPI from "../api/chat";
import SockJS from 'sockjs-client';
import Stomp from 'stompjs';
import { Notification } from 'element-ui';

Vue.use(Vuex);

const now = new Date();

const store = new Vuex.Store({
  state:{
    routes:[],//路由
    userInfo:{},//用户信息
    sessions:{},
    admins:[],
    currentSession: null,
    filterKey:'',
    stomp:null,
    currentAdmin: JSON.parse(window.sessionStorage.getItem('userInfo')),
    isDot:{}
  },

  mutations:{
    INIT_ADMIN(state, admin){
      state.currentAdmin = admin;
    },
    initRoutes(state,data){
      state.routes = data;
    },
    getUserInfo(state,data){
      state.userInfo = data;
    },
    changeCurrentSession (state,currentSession) {
      console.log(currentSession);
      state.currentSession = currentSession;
      state.currentAdmin = JSON.parse(window.sessionStorage.getItem('userInfo'));
      Vue.set(state.isDot,state.currentAdmin.username+ '#' + state.currentSession.username,false);
    },
    addMessage (state,msg) {
      let mss = state.sessions[state.currentAdmin.username+ '#' + msg.to];
      if(!mss) {
        // state.sessions[state.currentAdmin.username+ '#' + msg.to] = [];
        Vue.set(state.sessions,[state.currentAdmin.username+ '#' + msg.to],[]);
      }
      state.sessions[state.currentAdmin.username+ '#' + msg.to].push({
        content:msg,
        date: new Date(),
        self: !msg.notSelf
      })
    },
    INIT_DATA (state) {
      // 浏览器历史本地聊天记录
      let data = localStorage.getItem('vue-chat-session');
      if (data) {
        state.sessions = JSON.parse(data);
      }
    },
    INIT_ADMINS (state, data) {
      state.admins = data;
    }
  },

  actions:{
    connect(context) {
      context.state.stomp = Stomp.over(new SockJS('/ws/ep'));
      let token = sessionStorage.getItem('token')
      context.state.stomp.connect({'Auth-Token':token},success => {
        context.state.stomp.subscribe('/user/queue/chat',msg => {
          let receiveMsg = JSON.parse(msg.body);
          if (!context.state.currentSession || receiveMsg.from != context.state.currentSession.username){
            console.log("receiveMsg.content");
            console.log(receiveMsg);
            Notification.info({
              title: '['+receiveMsg.fromNickName+']发来一条消息',
              message: receiveMsg.content.length > 10 ? receiveMsg.content.substr(0,10) : receiveMsg.content,
              position: 'bottom-right'
            });
            Vue.set(context.state.isDot,context.state.currentAdmin.username+ '#' + receiveMsg.from,true);
          }
          receiveMsg.notSelf = true;
          receiveMsg.to = receiveMsg.from;
          context.commit('addMessage', receiveMsg);
        })
      },error => {

      })
    },
    initData (context) {
      context.commit('INIT_DATA');
      chatAPI.getAdmins().then(res => {
        if (res) {
          context.commit('INIT_ADMINS',res.data)
        }
      })
    }
  }
})

store.watch(function (state) {
  return state.sessions
},function (val) {
  console.log('CHANGE: ', val);
  localStorage.setItem('vue-chat-session', JSON.stringify(val));
},{
  deep:true/*这个貌似是开启watch监测的判断,官方说明也比较模糊*/
})


export default store;


